#include<bits/stdc++.h>
#define ll long long
using namespace std;
namespace IO{
    char buff[1<<21],*p1=buff,*p2=buff;
    char getch(){
        return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;
    }
    template<typename T>
    void read(T &x){
        char ch=getch();int fl=1;x=0;
        while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}
        while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}
        x*=fl;
    }
    template<typename T,typename ...Args>
    void read(T &x,Args& ...args){
        read(x);read(args...);
    }
    char obuf[1<<21],*p3=obuf;
    void putch(char ch){
        if(p3-obuf<(1<<21))*p3++=ch;
        else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;
    }
    void pc(const char *s){
    	while(*s)putch(*s),s++;
    }
    char ch[100];
    template<typename T>
    void write(T x){
        if(!x)return putch('0');
        if(x<0)putch('-'),x*=-1;
        int top=0;
        while(x)ch[++top]=x%10+48,x/=10;
        while(top)putch(ch[top]),top--;
    }
    template<typename T,typename ...Args>
    void write(T x,Args ...args){
        write(x),putch(' '),write(args...);
    }
    void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
bool ST;
const int N=1e6+5,mod=6661;
inline int Mod(int x){return x>=mod?x-mod:x;}
inline int poww(int x,int y){
	int sum=1;
	while(y){
		if(y&1)sum=1ll*sum*x%mod;
		x=1ll*x*x%mod;
		y>>=1;
	}
	return sum;
}
int C[mod][mod],SC[mod][mod];
int Calc(ll n,int m){
	int ans=1;
	while(n||m){
		(ans*=C[n%mod][m%mod])%=mod;
		n/=mod,m/=mod; 
	}
	return ans;
}
int inv[205];
int Calc_sum(ll n,int m){
	int sum=0,res=1;
	int X=(n/mod)%mod,_X=n%mod;
	for(int i=0,j=0;i<=m;i+=mod,j++){
		int r=min(i+mod-1,m);
		sum=(sum+SC[_X][r-i]*res)%mod;
		res=Mod(X+mod-j)*inv[j+1]%mod*res%mod;
	}
	return sum;
}
struct NODE{
	int sum;
	ll tmp;
	int St;
	NODE split(int l,int r){
		return NODE{Mod(Calc_sum(tmp,St+r)+mod-(St+l?Calc_sum(tmp,St+l-1):0)),tmp,St+l};
	}
};
NODE Init(ll x,int l,int r){
	return NODE{Mod(Calc_sum(x,r)+mod-(l?Calc_sum(x,l-1):0)),x,l};
}
struct node{
	int l,r;
	NODE val;
	friend bool operator <(node A,node B){
		return A.r<B.r;
	}
};
int n;

set<node>s;
int tree[N];
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int val){
	while(x<=n){
		tree[x]=Mod(tree[x]+val);
		x+=lowbit(x);
	}
}
inline int ask(int x){
	int sum=0;
	while(x){
		sum=Mod(sum+tree[x]);
		x-=lowbit(x);
	}
	return sum;
}
inline void Del(node x){
	add(x.r,mod-x.val.sum);
	s.erase(x);
	return;
}
inline void Add(node x){
	add(x.r,x.val.sum);
	s.insert(x);
	return;
}
inline void split(int x){
	if(x>n)return;
	auto S=s.lower_bound({0,x,{}});
	int l=(*S).l,r=(*S).r;NODE val=(*S).val;
	if(x==l)return;
	node sl=node{l,x-1,val.split(0,x-l-1)};
	node sr=node{x,r,NODE{Mod(val.sum+mod-sl.val.sum),val.tmp,val.St+(x-l)}};
	Del(*S),Add(sl),Add(sr);
}
inline void Del(int l,int r){
	split(l),split(r+1);
	int now=l;
	while(now<=r){
		node tmp=*s.lower_bound({0,now,{}});
		now=tmp.r+1;
		Del(tmp);
	}
}
inline void Add(int l,int r,ll x){return Add(node{l,r,Init(x,1,r-l+1)});}
int ask(int l,int r){split(l);split(r+1);return Mod(ask(r)+mod-ask(l-1));}
bool END;
signed main(){
	cerr<<(double)(&ST-&END)/1024/1024<<"MB\n";
	freopen("izumi.in","r",stdin);
	freopen("izumi.out","w",stdout);
	for(int i=0;i<mod;i++)
		for(int j=C[i][0]=1;j<=i;j++)
			C[i][j]=Mod(C[i-1][j-1]+C[i-1][j]);
	for(int i=0;i<mod;i++)
		for(int j=SC[i][0]=1;j<mod;j++)
			SC[i][j]=Mod(SC[i][j-1]+C[i][j]);
	for(int i=1;i<=200;i++)inv[i]=poww(i,mod-2);
	int q;ll asd;
	read(n,q,asd);
	Add(1,n,asd);
	while(q--){
		int ops;
		read(ops);
		if(ops==1){
			int l,r;ll x;
			read(l,r,x);
			Del(l,r);
			Add(l,r,x);
		}else{
			int l,r;
			read(l,r);
			write(ask(l,r)),putch('\n');
		}
	}
	return flush(),0;
}
